Visualización de datos

Encuentro 6

Visualización


La idea en esta presentación es mostrar paso a paso la construcción de un gráfico.

  • Partiremos del objetivo deseado, en este caso un tipo de gráfico que ya existe, pero podría ser algún otro ejemplo o un bosquejo de lo imaginado garabateado en un papel.

  • El segundo paso es determinar cuales son las variables necesarias para construir ese gráfico y donde se mapean.

  • El tercer paso es trabajar con los datos y transformarlos para que estén preparados para graficar.

  • El cuarto es el gráfico en si mismo con todas las personalizaciones de sus partes.

Gráfico objetivo


Queremos construir un gráfico similar a este

Variables participantes


  • El análisis del modelo indica que hay dos capas geométricas simultáneas: una de barras y otra de líneas.

  • También hay dos ejes y (a izquierda Números de casos y a derecha Tasas por 100.000) y un eje x (Años)

  • Las variables participantes son tres:

    • el número de casos que mapea en y1,
    • las tasas que mapean en y2 y
    • los años de la tendencia que se ubican en x.

Lectura y adecuación de los datos


Importamos datos de la tendencia de TB de la provincia de Santa Fe entre los años 1980 y 2008

library(tidyverse)
library(readxl)

tendencia1 <- read_excel("Tendencia tb 1980 2008 por provincia.xls", 
                        sheet = "SFE", range = "A6:A34", col_names = F) |> 
   rename("Año" = ...1)

tendencia2 <- read_excel("Tendencia tb 1980 2008 por provincia.xls", 
                        sheet = "SFE", range = "D6:E34", col_names = F) |> 
  rename("Casos" = ...1,
         "Tasa" = ...2)

tendencia <- tendencia1 |> 
  bind_cols(tendencia2) 

Lectura y adecuación de los datos


El dataframe necesario para este gráfico nos quedaría así:

# A tibble: 29 × 3
     Año Casos  Tasa
   <dbl> <dbl> <dbl>
 1  1980   904  36.2
 2  1981   790  31.2
 3  1982   853  33.3
 4  1983   802  30.9
 5  1984   794  30.2
 6  1985   669  25.1
 7  1986   659  24.5
 8  1987   516  18.9
 9  1988   722  26.2
10  1989   661  23.7
# ℹ 19 more rows

Primer gráfico


Iniciamos con el gráfico de barras. Mapeamos x e y, indicamos color de relleno e identidad porque las barras se van a construir con el conteo previo (datos agregados)

tendencia |> 
  ggplot(aes(x = Año, y = Casos)) +
  geom_bar(stat = "identity", 
           fill = "royalblue")

Primer gráfico

Capa de texto


Agregamos capa de texto con los valores de los casos.

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos)) +
  geom_bar(stat = "identity", 
           fill = "royalblue") +
  geom_text()

Capa de texto

Capa de texto


Adecuamos los valores en las barras.

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos)) +
  geom_bar(stat = "identity", 
           fill = "royalblue") +
  geom_text(hjust = 1.2, vjust = 0.5, angle = 90, color = "white")

Capa de texto

Eje x


Configuramos eje x

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos)) +
  geom_bar(stat = "identity", 
           fill = "royalblue") +
  geom_text(hjust = 1.2, vjust = 0.5, angle = 90, color = "white") +
  scale_x_continuous(name = "Años", breaks = seq(1980, 2008, 1))

Eje x

Eje x


Personalizamos mejor el eje x (ángulo de las etiquetas, etc)

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos)) +
  geom_bar(stat = "identity", 
           fill = "royalblue") +
  geom_text(hjust = 1.2, vjust = 0.5, angle = 90, color = "white") +
  scale_x_continuous(name = "Años", breaks = seq(1980, 2008, 1)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 11))

Eje x

Eje y


Configuramos el eje y asociado a las barras

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos)) +
  geom_bar(stat = "identity", 
           fill = "royalblue") +
  geom_text(hjust = 1.2, vjust = 0.5, angle = 90, color = "white") +
  scale_x_continuous(name = "Años", breaks = seq(1980, 2008, 1)) +
  scale_y_continuous(name = "Número de casos", breaks = seq(0, 1000, 200)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 11),
        axis.text.y = element_text(size = 11))

Eje y

Segundo gráfico


Incoporamos el segundo gráfico o segunda capa geométrica. Utilizamos una constante para llevar los valores al mismo orden de los valores de las barras.

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos)) +
  geom_bar(stat = "identity", 
           fill = "royalblue") +
  geom_line(aes(y = Tasa*35), color = "red", linewidth = 1.5) +
  geom_text(hjust = 1.2, vjust = 0.5, angle = 90, color = "white") +
  scale_x_continuous(name = "Años", 
                     breaks = seq(1980, 2008, 1)) +
  scale_y_continuous(name = "Número de casos", 
                     breaks = seq(0, 1000, 200),
                     sec.axis = sec_axis(~./35, 
                                         name = "Tasa")) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 11),
        axis.text.y = element_text(size = 11))

Segundo gráfico

Etiquetas del segundo gráfico


Agregamos etiquetas asociadas a la capa geométrica line

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos)) +
  geom_bar(stat = "identity", 
           fill = "royalblue") +
  geom_line(aes(y = Tasa*35), color = "red", linewidth = 1.5) +
  geom_text(hjust = 1.2, vjust = 0.5, angle = 90, color = "white") +
  geom_text(aes(label = round(Tasa,1), y = Tasa*35), angle = 45, hjust = -0.2, vjust = -0.5) +
  scale_x_continuous(name = "Años",
                     breaks = seq(1980, 2008, 1)) +
  scale_y_continuous(name = "Número de casos", 
                     breaks = seq(0, 1400, 200),
                     limits = c(0,1400),
                     sec.axis = sec_axis(~./35, 
                                         name = "Tasas por 100.000", 
                                         breaks = seq(0, 60, 10))) +
  theme(axis.text.x = element_text(angle = 45, 
                                   hjust = 1, 
                                   size = 11),
        axis.text.y = element_text(size = 11))

Etiquetas del segundo gráfico

Leyendas


Al igual que el modelo del gráfico, sumamos dentro del mismo las leyendas

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos, fill = "Número de casos")) +
  geom_bar(stat = "identity") +
  geom_line(aes(y = Tasa*35, color = "Tasas por 100.000"), linewidth = 1.5) +
  geom_text(hjust = 1.2, vjust = 0.5, angle = 90, color = "white") +
  geom_text(aes(label = round(Tasa,1), y = Tasa*35), angle = 45, hjust = -0.2, vjust = -0.5) +
  scale_x_continuous(name = "Años",
                     breaks = seq(1980, 2008, 1)) +
  scale_y_continuous(name = "Número de casos", 
                     breaks = seq(0, 1400, 200),
                     limits = c(0,1400),
                     sec.axis = sec_axis(~./35, 
                                         name = "Tasas por 100.000", 
                                         breaks = seq(0, 60, 10))) +
  scale_fill_manual(values = "royalblue") +
  scale_color_manual(values = "red") +
  theme(axis.text.x = element_text(angle = 45, 
                                   hjust = 1, 
                                   size = 11),
        axis.text.y = element_text(size = 11),
        legend.position = "inside",
        legend.position.inside = c(0.8, 0.8),
        legend.background = element_rect(fill = "transparent"),
        legend.text.position = "right",
        legend.title=element_blank()) +
  guides(color = guide_legend(order = 0),
         fill = guide_legend(order = 1))

Leyendas

Título y demás


Por último, definimos estructura de titulo, subtitulo y pie de gráfico (habría que reemplazarlos por la definición de cada uno).

tendencia |> 
  ggplot(aes(x = Año, y = Casos, label = Casos, fill = "Número de casos")) +
  geom_bar(stat = "identity") +
  geom_line(aes(y = Tasa*35, color = "Tasas por 100.000"), linewidth = 1.5) +
  geom_text(hjust = 1.2, vjust = 0.5, angle = 90, color = "white") +
  geom_text(aes(label = round(Tasa,1), y = Tasa*35), angle = 45, hjust = -0.2, vjust = -0.5) +
  scale_x_continuous(name = "Años",
                     breaks = seq(1980, 2008, 1)) +
  scale_y_continuous(name = "Número de casos", 
                     breaks = seq(0, 1400, 200),
                     limits = c(0,1400),
                     sec.axis = sec_axis(~./35, 
                                         name = "Tasas por 100.000", 
                                         breaks = seq(0, 60, 10))) +
  scale_fill_manual(values = "royalblue") +
  scale_color_manual(values = "red") +
  labs(title = "Titulo", subtitle = "subtitulo", caption = "pie de grafico" ) +
  theme(axis.text.x = element_text(angle = 45, 
                                   hjust = 1, 
                                   size = 11),
        axis.text.y = element_text(size = 11),
        legend.position = "inside",
        legend.position.inside = c(0.8, 0.8),
        legend.background = element_rect(fill = "transparent"),
        legend.text.position = "right",
        legend.title=element_blank()) +
  guides(color = guide_legend(order = 0),
         fill = guide_legend(order = 1))

Título y demás